package com.health.tools;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by nova on 2018/4/13.
 * 数据计算类
 */

public class ArithmeticUtils {
    /**
     * 从数据库读取数据
     * 保留两位小数【解决科学计数法、Double类型精度问题】
     *RoundingMode详解
     * https://blog.csdn.net/alanzyy/article/details/8465098
     * @param data
     * @return
     */
    public static String round2Db(Double data) {
        if (data != null) {
            DecimalFormat df = new DecimalFormat("0.00");
            Double d = new Double(data);
            df.setRoundingMode(RoundingMode.HALF_UP);
            return df.format(d);
        }
        return "";
    }
    /**
     * 从数据库读取数据
     * 保留两位小数【解决科学计数法、Double类型精度问题】
     *RoundingMode详解
     * https://blog.csdn.net/alanzyy/article/details/8465098
     * @param data
     * @return
     */
    public static String round1Db(Double data) {
        if (data != null) {
            DecimalFormat df = new DecimalFormat("0.0");
            Double d = new Double(data);
            df.setRoundingMode(RoundingMode.HALF_UP);
            return df.format(d);
        }
        return "";
    }

    /**
     * 从数据库读取数据
     * 保留0小数【解决科学计数法、Double类型精度问题】
     *
     * @param data
     * @return
     */
    public static String round0Db(Double data) {
        if (data != null) {
            DecimalFormat df = new DecimalFormat("0");
            Double d = new Double(data);
            return df.format(d);
        }
        return "";
    }

    /**
     * 除法运算
     *
     * @param d1
     * @param d2
     * @param len
     * @return
     */
    public static Double div(Double d1, Double d2, int len) {
        if (d1 != null && d2 != null) {
            BigDecimal b1 = new BigDecimal(d1);
            BigDecimal b2 = new BigDecimal(d2);
            if (b2.equals(BigDecimal.ZERO)) {
                return 0.0000;
            } else {
                return b1.divide(b2, len, BigDecimal.ROUND_HALF_UP).doubleValue();
            }

        } else {
            if (d2 == null) {
                return 0.0000;
            }
        }

        return null;
    }

    // 进行乘法运算
    public static Double mul(Double d1, Double d2, int len) {
        if (d1 != null && d2 != null) {
            BigDecimal b1 = new BigDecimal(d1);
            BigDecimal b2 = new BigDecimal(d2);
            return round(b1.multiply(b2).doubleValue(), len);
        }
        return null;
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v     需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 匹配是否为数字
     *
     * @param str 可能为中文，也可能是-19162431.1254，不使用BigDecimal的话，变成-1.91624311254E7
     * @return
     * @author yutao
     * @date 2016年11月14日下午7:41:22
     */
    public static boolean isNumeric(String str) {
        // 该正则表达式可以匹配所有的数字 包括负数
        Pattern pattern = Pattern.compile("-?[0-9]+(\\.[0-9]+)?");
        String bigStr;
        try {
            bigStr = new BigDecimal(str).toString();
        } catch (Exception e) {
            return false;//异常 说明包含非数字。
        }

        Matcher isNum = pattern.matcher(bigStr); // matcher是全匹配
        if (!isNum.matches()) {
            return false;
        }
        return true;
    }
}
